import numpy as np
from sklearn.decomposition import PCA
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.neighbors import NearestNeighbors
import hnswlib

# 生成随机高维数据
np.random.seed(42)
def generate_data(num_points=500, dimensions=100):
    """生成随机高维数据"""
    return np.random.rand(num_points, dimensions)

# 原始高维数据
original_data = generate_data(num_points=1000, dimensions=100)

# 降维：使用PCA进行数据降维
pca = PCA(n_components=10)  # 降到10维
reduced_data = pca.fit_transform(original_data)
# 打印降维后的数据形状
print("原始数据形状:", original_data.shape)
print("降维后数据形状:", reduced_data.shape)

# 构建HNSW索引并进行近似最近邻搜索
# 初始化HNSW索引
hnsw_index = hnswlib.Index(space='l2', dim=10)  # 使用欧氏距离，10维数据
hnsw_index.init_index(max_elements=1000, ef_construction=200, M=16)
hnsw_index.add_items(reduced_data)
# 设置查询参数
hnsw_index.set_ef(50)  # 提升检索精度
# 查询一个向量的最近邻
query_vector = reduced_data[0]  # 使用第一个降维后的向量进行查询
labels, distances = hnsw_index.knn_query(query_vector, k=5)
# 打印查询结果
print("\n查询向量最近邻的索引:", labels[0])
print("对应的距离:", distances[0])

# 比较降维前后相似度结果
def compute_similarity(original_data, reduced_data, query_index=0):
    """比较降维前后查询结果的相似性"""
    original_query = original_data[query_index].reshape(1, -1)
    reduced_query = reduced_data[query_index].reshape(1, -1)
    # 使用余弦相似度比较
    original_similarities = cosine_similarity(original_query, original_data)[0]
    reduced_similarities = cosine_similarity(reduced_query, reduced_data)[0]
    print("\n降维前最相似的索引:", np.argsort(original_similarities)[-5:][::-1])
    print("降维后最相似的索引:", np.argsort(reduced_similarities)[-5:][::-1])

# 调用比较函数（修正了缩进错误）
compute_similarity(original_data, reduced_data, query_index=0)